﻿/*
求组合数 
Time Limit:1000MS  Memory Limit:32768K


Description:
组合数的计算虽说简单但也不乏有些陷阱，这主要是因为语言中的数据类型在表示范围上是有限的。更何况还有中间结果溢出的现象，所以千万要小心。

Input:
求组合数的数据都是成对（M与N）出现的，每对整数M和N满足0<m, n≤20。 
Output:
输出该组合数。每个组合数换行。 
Sample Input:
5 2
18 13
Sample Output:
10
8568

*/


#include <stdio.h>
#define MAX_ELEMS 32
unsigned long cnr(unsigned int n, unsigned int r)
{
	unsigned int i, j;
	int a[MAX_ELEMS]={0};

	if(r==0||r>=n)return 1;

	if((r<<1)>n)r=n-r;
	
	for (i=0; i<=r; ++i) 
		a[i]=1U;
	for (i=1; i<=n-r; ++i)
		for (j=1; j<=r; ++j)
			a[j]+=a[j-1];
	return a[r];	
}
int main(int argc, char* argv[])
{
	unsigned int n, r;
	while (EOF!=scanf("%u%u", &n, &r))
	{
		printf("%lu\n", cnr(n, r));
	}

	return 0;
}